1 Introduction

The objective of this notebook is to separate the microenvironment (T cells, monocytes, etc.) from the leukemic B (CD79+) cells.

2 Pre-processing

2.1 Load packages

library(Seurat)
library(SeuratWrappers)
library(harmony)
library(tidyverse)

2.2 Define parameters

# Paths
path_to_obj <- here::here("results/R_objects/3.seurat_filtered.rds")
path_to_save_microenv <- here::here("results/R_objects/4.seurat_microenvironment.rds")
path_to_save_leukemic <- here::here("results/R_objects/4.seurat_leukemic.rds")


# Colors
color_palette <- c("black", "gray", "red", "yellow", "violet", "green4",
                   "blue", "mediumorchid2", "coral2", "blueviolet",
                   "indianred4", "deepskyblue1", "dimgray", "deeppink1",
                   "green", "lightgray", "hotpink1")


# Source functions
source(here::here("bin/utils.R"))

2.3 Load data

seurat <- readRDS(path_to_obj)

3 Normalization, Dimensionality reduction and batch effect correction

seurat <- seurat %>%
  NormalizeData(
    normalization.method = "LogNormalize",
    scale.factor = 10000
  ) %>%
  FindVariableFeatures() %>%
  ScaleData() %>%
  RunPCA() %>%
  RunHarmony(group.by.vars = "sample_id", reduction = "pca", dims = 1:30) %>%
  RunUMAP(dims = 1:30, reduction = "harmony")

4 Visualize lineage markers

To ease the annotation, let us visualize some key lineage markers

lineage_markers <- c("CD79A", "CD3D", "CD8A", "IL7R", "NKG7",
                     "LYZ", "HBM", "TOP2A")
lineage_markers_ggs <- purrr::map(lineage_markers, function(x) {
  p <- FeaturePlot(seurat, features = x, pt.size = 0.45)
  p +
    scale_color_viridis_c(option = "magma")
})
names(lineage_markers_ggs) <- lineage_markers
lineage_markers_ggs
## $CD79A

## 
## $CD3D

## 
## $CD8A

## 
## $IL7R

## 
## $NKG7

## 
## $LYZ

## 
## $HBM

## 
## $TOP2A

5 Cluster

seurat <- FindNeighbors(
  seurat,
  dims = 1:30,
  reduction = "harmony"
)
seurat <- FindClusters(seurat, resolution = 0.1)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 40725
## Number of edges: 1073882
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.9560
## Number of communities: 6
## Elapsed time: 12 seconds
DimPlot(seurat, cols = color_palette, pt.size = 0.3)

richter_levels <- c("richter_sp", "richter_while-ibrutinib",
                    "richter_post-ofatu-duvelisib")
seurat$is_richter <- ifelse(
  seurat$sample_description %in% richter_levels,
  TRUE,
  FALSE
)
DimPlot(seurat, group.by = "is_richter")

DimPlot(seurat, group.by = "tissue")

In addition, we have seen a cluster of erythroblasts (HBM+) that cluster with the CD79A+ cells, most likely due to its strong proliferative signature. We will fetch them with the FindSubCluster function and rule them out from the analysis:

# Subcluster
seurat <- FindSubCluster(
  seurat,
  cluster = "3",
  graph.name = "RNA_snn",
  subcluster.name = "fetch_erythroblasts",
  resolution = 0.2
)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 951
## Number of edges: 30548
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.8995
## Number of communities: 5
## Elapsed time: 0 seconds
DimPlot(seurat, group.by = "fetch_erythroblasts", cols = color_palette)

Idents(seurat) <- "fetch_erythroblasts"


# Find markers of potential erythroblasts
markers_erythroblasts <- purrr::map(c("3_3", "3_4"), function(x) {
  df <- FindMarkers(
    seurat,
    ident.1 = x,
    only.pos = TRUE,
    logfc.threshold = 0.75
  )
  df <- df %>%
    rownames_to_column("gene") %>%
    arrange(desc(avg_log2FC))
  df
})
names(markers_erythroblasts) <- c("3_3", "3_4")
DT::datatable(markers_erythroblasts$`3_3`)
DT::datatable(markers_erythroblasts$`3_4`)
# Subset
mask <- colnames(seurat)[!(seurat$fetch_erythroblasts %in% c("3_3", "3_4"))]
seurat <- subset(seurat, cells = mask)
DimPlot(seurat, cols = color_palette)

6 Separate CD5+ B cells from microenvironment

As we can see, clusters 2 and 4 correspond to T cells, NK cells and monocytes.

microenv_clusters <- c("2", "4")
leuk_clusters <- c("0", "1", "3_0", "3_1", "3_2")
microenv <- subset(seurat, idents = microenv_clusters)
leuk <- subset(seurat, idents = leuk_clusters)
DimPlot(leuk, cols = color_palette, pt.size = 0.3)

DimPlot(microenv, cols = color_palette, pt.size = 0.3)

7 Save

saveRDS(microenv, path_to_save_microenv)
saveRDS(leuk, path_to_save_leukemic)

8 Sesion Information

sessionInfo()
## R version 4.0.4 (2021-02-15)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=es_ES.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=es_ES.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=es_ES.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] forcats_0.5.1        stringr_1.4.0        dplyr_1.0.6          purrr_0.3.4          readr_1.4.0          tidyr_1.1.3          tibble_3.1.2         ggplot2_3.3.3        tidyverse_1.3.1      harmony_1.0          Rcpp_1.0.6           SeuratWrappers_0.3.0 SeuratObject_4.0.2   Seurat_4.0.3         BiocStyle_2.18.1    
## 
## loaded via a namespace (and not attached):
##   [1] readxl_1.3.1          backports_1.2.1       plyr_1.8.6            igraph_1.2.6          lazyeval_0.2.2        splines_4.0.4         crosstalk_1.1.1       listenv_0.8.0         scattermore_0.7       digest_0.6.27         htmltools_0.5.1.1     fansi_0.5.0           magrittr_2.0.1        tensor_1.5            cluster_2.1.1         ROCR_1.0-11           limma_3.46.0          remotes_2.4.0         globals_0.14.0        modelr_0.1.8          matrixStats_0.59.0    spatstat.sparse_2.0-0 colorspace_2.0-1      rvest_1.0.0           ggrepel_0.9.1         haven_2.4.1           xfun_0.23             crayon_1.4.1          jsonlite_1.7.2        spatstat.data_2.1-0   survival_3.2-10       zoo_1.8-9             glue_1.4.2            polyclip_1.10-0       gtable_0.3.0          leiden_0.3.8          future.apply_1.7.0    abind_1.4-5           scales_1.1.1          DBI_1.1.1             miniUI_0.1.1.1        viridisLite_0.4.0     xtable_1.8-4          reticulate_1.20       spatstat.core_2.1-2   rsvd_1.0.5            DT_0.18               htmlwidgets_1.5.3     httr_1.4.2            RColorBrewer_1.1-2    ellipsis_0.3.2        ica_1.0-2             farver_2.1.0          pkgconfig_2.0.3      
##  [55] sass_0.4.0            uwot_0.1.10           dbplyr_2.1.1          deldir_0.2-10         here_1.0.1            utf8_1.2.1            labeling_0.4.2        tidyselect_1.1.1      rlang_0.4.11          reshape2_1.4.4        later_1.2.0           munsell_0.5.0         cellranger_1.1.0      tools_4.0.4           cli_2.5.0             generics_0.1.0        broom_0.7.7           ggridges_0.5.3        evaluate_0.14         fastmap_1.1.0         yaml_2.2.1            goftest_1.2-2         knitr_1.33            fs_1.5.0              fitdistrplus_1.1-5    RANN_2.6.1            pbapply_1.4-3         future_1.21.0         nlme_3.1-152          mime_0.10             xml2_1.3.2            compiler_4.0.4        rstudioapi_0.13       plotly_4.9.4          png_0.1-7             spatstat.utils_2.2-0  reprex_2.0.0          bslib_0.2.5.1         stringi_1.6.2         highr_0.9             RSpectra_0.16-0       lattice_0.20-41       Matrix_1.3-4          vctrs_0.3.8           pillar_1.6.1          lifecycle_1.0.0       BiocManager_1.30.15   spatstat.geom_2.1-0   lmtest_0.9-38         jquerylib_0.1.4       RcppAnnoy_0.0.18      data.table_1.14.0     cowplot_1.1.1         irlba_2.3.3          
## [109] httpuv_1.6.1          patchwork_1.1.1       R6_2.5.0              bookdown_0.22         promises_1.2.0.1      KernSmooth_2.23-18    gridExtra_2.3         parallelly_1.26.0     codetools_0.2-18      MASS_7.3-53.1         assertthat_0.2.1      rprojroot_2.0.2       withr_2.4.2           sctransform_0.3.2     mgcv_1.8-36           parallel_4.0.4        hms_1.1.0             grid_4.0.4            rpart_4.1-15          rmarkdown_2.8         Rtsne_0.15            shiny_1.6.0           lubridate_1.7.10